/**
 * Copyright (c) Huawei Technologies Co., Ltd. 1987-2021. All rights reserved.
*/

package com.gitee.fufu669.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.MalformedURLException;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.Iterator;
import java.util.Map;

/**
 * TODO
*/
public class CacheHttpUtil {

    /**
     * TODO
    */
    public static final Logger logger = LoggerFactory.getLogger(CacheHttpUtil.class);

    // post请求
    /**
     *  post请求
    */
    public static final String HTTP_POST = "POST";

    // get请求
    /**
     *  get请求
    */
    public static final String HTTP_GET = "GET";

    // utf-8字符编码
    /**
     *  utf-8字符编码
    */
    public static final String CHARSET_UTF_8 = "utf-8";

    // HTTP内容类型。如果未指定ContentType，默认为TEXT/HTML
    /**
     *  HTTP内容类型。如果未指定ContentType，默认为TEXT/HTML
    */
    public static final String CONTENT_TYPE_TEXT_HTML = "text/xml";

    // HTTP内容类型。相当于form表单的形式，提交暑假
    /**
     *  HTTP内容类型。相当于form表单的形式，提交暑假
    */
    public static final String CONTENT_TYPE_FORM_URL = "application/x-www-form-urlencoded";

    // 请求超时时间
    /**
     *  请求超时时间
    */
    public static final int SEND_REQUEST_TIME_OUT = 50000;

    // 将读超时时间
    /**
     *  将读超时时间
    */
    public static final int READ_TIME_OUT = 50000;

    /**
     * TODO
    */
    public static String getAutoCharSet(String urlStr) {
        // 返回
        return get(urlStr);
    }

    /**
     * TODO
    */
    public static String get(String urlStr) {
        // 返回
        return get(urlStr, "utf-8");
    }

    /**
     * TODO
     */
    public static String getJson(String urlStr) {
        // 返回
        return getJson(urlStr, "utf-8");
    }

    /**
     * 将map集合的键值对转化成：key1=value1&key2=value2 的形式
     *
     * @param parameterMap 需要转化的键值对集合
     * @return 字符串
     */
    public static String convertStringParamter(Map parameterMap) {
        // 创建
        StringBuffer parameterBuffer = new StringBuffer();
        // 判断是否非空
        if (parameterMap != null) {
            // TODO
            Iterator iterator = parameterMap.keySet().iterator();
            // 赋值
            String key = null;
            // 赋值
            String value = null;
            // 循环
            while (iterator.hasNext()) {
                // TODO
                key = (String) iterator.next();
                // 判断是否非空
                if (parameterMap.get(key) != null) {
                    // 拿出
                    value = (String) parameterMap.get(key);
                // 否则
                } else {
                    // 赋值
                    value = "";
                }
                // 增加字符串
                parameterBuffer.append(key).append("=").append(value);
                // 判断
                if (iterator.hasNext()) {
                    // 增加字符串
                    parameterBuffer.append("&");
                }
            }
        }
        // 返回
        return parameterBuffer.toString();
    }

//    public static void main(String[] args) throws MalformedURLException {

    /**
     * TODO
    */
    public static String get(String urlStr, String charset) {
        // 是否有http正文提交
        boolean isDoInput = false;
        // 赋值
        OutputStream outputStream = null;
        // 赋值
        OutputStreamWriter outputStreamWriter = null;
        // 赋值
        InputStream inputStream = null;
        // 赋值
        InputStreamReader inputStreamReader = null;
        // 赋值
        BufferedReader reader = null;
        // 创建
        StringBuffer resultBuffer = new StringBuffer();
        // 赋值
        String tempLine = null;
        // 尝试下面的代码
        try {
            // 统一资源
            URL url = new URL(urlStr);
            // 连接类的父类，抽象类
            URLConnection urlConnection = url.openConnection();
            // http的连接类
            HttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection;
            // 设置是否从httpUrlConnection读入，默认情况下是true;
            httpURLConnection.setDoInput(true);
            // 设置一个指定的超时值（以毫秒为单位）
            httpURLConnection.setConnectTimeout(SEND_REQUEST_TIME_OUT);
            // 将读超时设置为指定的超时，以毫秒为单位。
            httpURLConnection.setReadTimeout(READ_TIME_OUT);
            // Post 请求不能使用缓存
            httpURLConnection.setUseCaches(false);
            // 设置字符编码
            httpURLConnection.setRequestProperty("Accept", "text/html, application/xhtml+xml, application/xml;q=0.9, image/webp, image/apng, */**;q=0.8");
            // TODO
            httpURLConnection.setRequestProperty("Cache-Control", "max-age=0");
            // TODO
            httpURLConnection.setRequestProperty("Upgrade-Insecure-Requests", "1");
            // TODO
            httpURLConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36");
            // 设定请求的方法，默认是GET
            httpURLConnection.setRequestMethod("GET");
            // 打开到此 URL 引用的资源的通信链接（如果尚未建立这样的连接）。
            httpURLConnection.connect();
            // 判断
            if (httpURLConnection.getResponseCode() >= 300) {
                // 判断
                if (httpURLConnection.getResponseCode() == 302) {
                    // 字符串赋值
                    String location = httpURLConnection.getHeaderField("location");
                    // TODO
                    System.out.println("访问url:"+urlStr+":重定向:"+location);
                    // 返回
                    return get(location, charset);
                }
                // 抛出异常
                throw new Exception(
                        // TODO
                        "HTTP Request is not success, Response code is " + httpURLConnection.getResponseCode());
            }
            // 判断
            if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                // 拿到输入流
                inputStream = httpURLConnection.getInputStream();
                // 判断
                if (StringUtils.isEmpty(charset)) {
                    // 赋值
                    charset = "utf-8";
                }
                // 创建
                inputStreamReader = new InputStreamReader(inputStream, charset);
                // 创建
                reader = new BufferedReader(inputStreamReader);
                // 循环
                while ((tempLine = reader.readLine()) != null) {
                    // 增加字符串
                    resultBuffer.append(tempLine);
                    // 增加字符串
                    resultBuffer.append("\n");
                }
            }
        // 捕捉异常
        } catch (MalformedURLException e) {
            // 打印异常
            e.printStackTrace();
        // 捕捉异常
        } catch (IOException e) {
            // 打印异常
            e.printStackTrace();
        // 捕捉异常
        } catch (Exception e) {
            // 打印异常
            e.printStackTrace();
        // 最终执行
        } finally {// 关闭流
            // 尝试下面的代码
            try {
                // 判断是否非空
                if (outputStreamWriter != null) {
                    // 关闭
                    outputStreamWriter.close();
                }
            // 捕捉异常
            } catch (Exception e) {
                // 打印异常
                e.printStackTrace();
            }
            // 尝试下面的代码
            try {
                // 判断是否非空
                if (outputStream != null) {
                    // 关闭
                    outputStream.close();
                }
            // 捕捉异常
            } catch (Exception e) {
                // 打印异常
                e.printStackTrace();
            }
            // 尝试下面的代码
            try {
                // 判断是否非空
                if (reader != null) {
                    // 关闭
                    reader.close();
                }
            // 捕捉异常
            } catch (Exception e) {
                // 打印异常
                e.printStackTrace();
            }
            // 尝试下面的代码
            try {
                // 判断是否非空
                if (inputStreamReader != null) {
                    // 关闭
                    inputStreamReader.close();
                }
            // 捕捉异常
            } catch (Exception e) {
                // 打印异常
                e.printStackTrace();
            }
            // 尝试下面的代码
            try {
                // 判断是否非空
                if (inputStream != null) {
                    // 关闭
                    inputStream.close();
                }
            // 捕捉异常
            } catch (Exception e) {
                // 打印异常
                e.printStackTrace();
            }
        }
        // 返回
        return resultBuffer.toString();
    }

    /**
     * TODO
     */
    public static String getJson(String urlStr, String charset) {
        // 是否有http正文提交
        boolean isDoInput = false;
        // 赋值
        OutputStream outputStream = null;
        // 赋值
        OutputStreamWriter outputStreamWriter = null;
        // 赋值
        InputStream inputStream = null;
        // 赋值
        InputStreamReader inputStreamReader = null;
        // 赋值
        BufferedReader reader = null;
        // 创建
        StringBuffer resultBuffer = new StringBuffer();
        // 赋值
        String tempLine = null;
        // 尝试下面的代码
        try {
            // 统一资源
            URL url = new URL(urlStr);
            // 连接类的父类，抽象类
            URLConnection urlConnection = url.openConnection();
            // http的连接类
            HttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection;
            // 设置是否从httpUrlConnection读入，默认情况下是true;
            httpURLConnection.setDoInput(true);
            // 设置一个指定的超时值（以毫秒为单位）
            httpURLConnection.setConnectTimeout(SEND_REQUEST_TIME_OUT);
            // 将读超时设置为指定的超时，以毫秒为单位。
            httpURLConnection.setReadTimeout(READ_TIME_OUT);
            // Post 请求不能使用缓存
            httpURLConnection.setUseCaches(false);
            // 设置字符编码
            httpURLConnection.setRequestProperty("Accept", "application/json, text/javascript, */*; q=0.01");
            // TODO
            httpURLConnection.setRequestProperty("Cache-Control", "max-age=0");
            // TODO
            httpURLConnection.setRequestProperty("Upgrade-Insecure-Requests", "1");
            // TODO
            httpURLConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36");
            // 设定请求的方法，默认是GET
            httpURLConnection.setRequestMethod("GET");
            // 打开到此 URL 引用的资源的通信链接（如果尚未建立这样的连接）。
            httpURLConnection.connect();
            // 判断
            if (httpURLConnection.getResponseCode() >= 300) {
                // 判断
                if (httpURLConnection.getResponseCode() == 302) {
                    // 字符串赋值
                    String location = httpURLConnection.getHeaderField("location");
                    // TODO
                    System.out.println("访问url:"+urlStr+":重定向:"+location);
                    // 返回
                    return get(location, charset);
                }
                // 抛出异常
                throw new Exception(
                        // TODO
                        "HTTP Request is not success, Response code is " + httpURLConnection.getResponseCode());
            }
            // 判断
            if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                // 拿到输入流
                inputStream = httpURLConnection.getInputStream();
                // 判断
                if (StringUtils.isEmpty(charset)) {
                    // 赋值
                    charset = "utf-8";
                }
                // 创建
                inputStreamReader = new InputStreamReader(inputStream, charset);
                // 创建
                reader = new BufferedReader(inputStreamReader);
                // 循环
                while ((tempLine = reader.readLine()) != null) {
                    // 增加字符串
                    resultBuffer.append(tempLine);
                    // 增加字符串
                    resultBuffer.append("\n");
                }
            }
            // 捕捉异常
        } catch (MalformedURLException e) {
            // 打印异常
            e.printStackTrace();
            // 捕捉异常
        } catch (IOException e) {
            // 打印异常
            e.printStackTrace();
            // 捕捉异常
        } catch (Exception e) {
            // 打印异常
            e.printStackTrace();
            // 最终执行
        } finally {// 关闭流
            // 尝试下面的代码
            try {
                // 判断是否非空
                if (outputStreamWriter != null) {
                    // 关闭
                    outputStreamWriter.close();
                }
                // 捕捉异常
            } catch (Exception e) {
                // 打印异常
                e.printStackTrace();
            }
            // 尝试下面的代码
            try {
                // 判断是否非空
                if (outputStream != null) {
                    // 关闭
                    outputStream.close();
                }
                // 捕捉异常
            } catch (Exception e) {
                // 打印异常
                e.printStackTrace();
            }
            // 尝试下面的代码
            try {
                // 判断是否非空
                if (reader != null) {
                    // 关闭
                    reader.close();
                }
                // 捕捉异常
            } catch (Exception e) {
                // 打印异常
                e.printStackTrace();
            }
            // 尝试下面的代码
            try {
                // 判断是否非空
                if (inputStreamReader != null) {
                    // 关闭
                    inputStreamReader.close();
                }
                // 捕捉异常
            } catch (Exception e) {
                // 打印异常
                e.printStackTrace();
            }
            // 尝试下面的代码
            try {
                // 判断是否非空
                if (inputStream != null) {
                    // 关闭
                    inputStream.close();
                }
                // 捕捉异常
            } catch (Exception e) {
                // 打印异常
                e.printStackTrace();
            }
        }
        // 返回
        return resultBuffer.toString();
    }

    /**
     * TODO
    */
    public static String get302Url(String urlStr, String charset) {
        // 是否有http正文提交
        boolean isDoInput = false;
        // 赋值
        OutputStream outputStream = null;
        // 赋值
        OutputStreamWriter outputStreamWriter = null;
        // 赋值
        InputStream inputStream = null;
        // 赋值
        InputStreamReader inputStreamReader = null;
        // 赋值
        BufferedReader reader = null;
        // 创建
        StringBuffer resultBuffer = new StringBuffer();
        // 赋值
        String tempLine = null;
        // 尝试下面的代码
        try {
            // 统一资源
            URL url = new URL(urlStr);
            // 连接类的父类，抽象类
            URLConnection urlConnection = url.openConnection();
            // http的连接类
            HttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection;
            // 设置是否从httpUrlConnection读入，默认情况下是true;
            httpURLConnection.setDoInput(true);
            // 设置一个指定的超时值（以毫秒为单位）
            httpURLConnection.setConnectTimeout(SEND_REQUEST_TIME_OUT);
            // 将读超时设置为指定的超时，以毫秒为单位。
            httpURLConnection.setReadTimeout(READ_TIME_OUT);
            // Post 请求不能使用缓存
            httpURLConnection.setUseCaches(false);
            // 设置字符编码
            httpURLConnection.setRequestProperty("Accept", "text/html, application/xhtml+xml, application/xml;q=0.9, image/webp, image/apng, */**;q=0.8");
            // TODO
            httpURLConnection.setRequestProperty("Cache-Control", "max-age=0");
            // TODO
            httpURLConnection.setRequestProperty("Upgrade-Insecure-Requests", "1");
            // TODO
            httpURLConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36");
            // 设定请求的方法，默认是GET
            httpURLConnection.setRequestMethod("GET");
            // 打开到此 URL 引用的资源的通信链接（如果尚未建立这样的连接）。
            httpURLConnection.connect();
            // 判断
            if (httpURLConnection.getResponseCode() >= 300) {
                // 判断
                if (httpURLConnection.getResponseCode() == 302) {
                    // 字符串赋值
                    String location = httpURLConnection.getHeaderField("location");
                    // 返回
                    return location;
                }
                // 抛出异常
                throw new Exception(
                        // TODO
                        "HTTP Request is not success, Response code is " + httpURLConnection.getResponseCode());
            }
            // 返回
            return "";
        // 捕捉异常
        } catch (MalformedURLException e) {
            // 打印异常
            e.printStackTrace();
        // 捕捉异常
        } catch (IOException e) {
            // 打印异常
            e.printStackTrace();
        // 捕捉异常
        } catch (Exception e) {
            // 打印异常
            e.printStackTrace();
        // 最终执行
        } finally {// 关闭流
            // 尝试下面的代码
            try {
                // 判断是否非空
                if (outputStreamWriter != null) {
                    // 关闭
                    outputStreamWriter.close();
                }
            // 捕捉异常
            } catch (Exception e) {
                // 打印异常
                e.printStackTrace();
            }
            // 尝试下面的代码
            try {
                // 判断是否非空
                if (outputStream != null) {
                    // 关闭
                    outputStream.close();
                }
            // 捕捉异常
            } catch (Exception e) {
                // 打印异常
                e.printStackTrace();
            }
            // 尝试下面的代码
            try {
                // 判断是否非空
                if (reader != null) {
                    // 关闭
                    reader.close();
                }
            // 捕捉异常
            } catch (Exception e) {
                // 打印异常
                e.printStackTrace();
            }
            // 尝试下面的代码
            try {
                // 判断是否非空
                if (inputStreamReader != null) {
                    // 关闭
                    inputStreamReader.close();
                }
            // 捕捉异常
            } catch (Exception e) {
                // 打印异常
                e.printStackTrace();
            }
            // 尝试下面的代码
            try {
                // 判断是否非空
                if (inputStream != null) {
                    // 关闭
                    inputStream.close();
                }
            // 捕捉异常
            } catch (Exception e) {
                // 打印异常
                e.printStackTrace();
            }
        }
        // 返回
        return resultBuffer.toString();
    }

}
